package main

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// /使用 viper 读取，setConfigFile 填写的路径是相对于 main.go 的路径
func main() {
	viper.SetConfigFile("./config-debug.yaml")
	if err := viper.ReadInConfig(); err != nil {
		panic(err)
	}
	fmt.Println(viper.GetString("host")) // "127.0.0.1"
}

func mainl() {
	//viper.SetConfigName 设置文件名，不需要带后缀
	//viper.SetConfigType 设置文件类型
	//viper.AddConfigPath 设置文件路径
	viper.SetConfigName("config-debug")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./")
	if err := viper.ReadInConfig(); err != nil {
		panic(err)
	}
	fmt.Println(viper.GetString("host")) // "127.0.0.1"
}

// 将配置文件中的配置映射到结构体中
type Server struct {
	Host string `mapstructure:"host"`
	Port int    `mapstructure:"port"`
}

func maink() {
	var server Server
	viper.SetConfigName("config-debug")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./")
	if err := viper.ReadInConfig(); err != nil {
		panic(err)
	}
	if err := viper.Unmarshal(&server); err != nil {
		panic(err)
	}
	fmt.Println(server.Host) // "127.0.0.1"
}

// 监听配置信息的变化
func mainj() {
	/*
			如果配置文件发生变化，viper 支持在运行时监听配置文件的变化
		   使用 viper.WatchConfig 来监听配置文件的变化，使用 viper.OnConfigChange 来监听配置文件的变化
		   onConfigChange 传入的参数是一个函数，函数的参数是 fsnotify.Event，在函数中重新读取配置文件，
			然后将配置文件中的配置映射到结构体中
	*/
	var server Server
	viper.OnConfigChange(func(e fsnotify.Event) {
		_ = viper.ReadInConfig()
		_ = viper.Unmarshal(&server)
	})
	viper.WatchConfig()
}
